/*******************************************************************************
 * Copyright (c) 2004, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.gef.ui.palette;

import org.eclipse.swt.widgets.Composite;

import org.eclipse.core.runtime.Assert;

import org.eclipse.gef.EditDomain;

/**
 * PaletteViewerProvider provides a standard way of creating palette viewers
 * that can be shared across different clients that need to create a palette
 * (PaletteViewerPage and FlyoutPaletteComposite, for instance).
 * 
 * @author Pratik Shah
 * @since 3.0
 */
public class PaletteViewerProvider {

	private EditDomain graphicalViewerEditDomain;

	/**
	 * Constructor
	 * 
	 * @param graphicalViewerDomain
	 *            The EditDomain with which each newly created PaletteViewer
	 *            will be registered
	 */
	public PaletteViewerProvider(EditDomain graphicalViewerDomain) {
		Assert.isNotNull(graphicalViewerDomain);
		graphicalViewerEditDomain = graphicalViewerDomain;
	}

	/**
	 * This method is invoked from {@link #createPaletteViewer(Composite)}. It
	 * configures the given viewer's settings.
	 * 
	 * @param viewer
	 *            the viewer that is to be configured
	 */
	protected void configurePaletteViewer(PaletteViewer viewer) {
		viewer.setContextMenu(new PaletteContextMenuProvider(viewer));
	}

	/**
	 * Creates a PaletteViewer on the given Composite
	 * 
	 * @param parent
	 *            the control for the PaletteViewer
	 * @return the newly created PaletteViewer
	 */
	public PaletteViewer createPaletteViewer(Composite parent) {
		PaletteViewer pViewer = new PaletteViewer();
		pViewer.createControl(parent);
		configurePaletteViewer(pViewer);
		hookPaletteViewer(pViewer);
		return pViewer;
	}

	/**
	 * @return the EditDomain provided during creation of this
	 *         PaletteViewerProvider
	 */
	public final EditDomain getEditDomain() {
		return graphicalViewerEditDomain;
	}

	/**
	 * This method is invoked from {@link #createPaletteViewer(Composite)}. It
	 * is a step in the process of setting up the PaletteViewer after it has
	 * been created.
	 * 
	 * @param viewer
	 *            the viewer that is to be configured
	 */
	protected void hookPaletteViewer(PaletteViewer viewer) {
		getEditDomain().setPaletteViewer(viewer);
	}

}
